//
// Created by wxd on 2025/9/11.
//

#pragma once

#ifndef IMATERIAL_H
#define IMATERIAL_H

#include <string>
#include "../glFramework/shader/Shader.h"
#include <memory>
#include <unordered_map>

enum class MaterialType {
    NONE,
    PHONG_MATERIAL,
    LIGHTON_MATERIAL, // 光源材质(纯色材质)
};

namespace EngineMaterialParam {
    struct DepthParams {

    };

    struct StencilParams {

    };

    struct BlendParams {

    };

    struct CullParams {

    };
}

class IMaterial {
public:
    virtual ~IMaterial() = default;

    // 获取材质类型
    virtual MaterialType getType() = 0;

    // 获取材质对应的唯一TraceId
    virtual std::string getTraceId() = 0;

    // 获取材质名称
    virtual std::string getName() = 0;

    // 加载着色器
    virtual void loadShader(const std::string& vertPath, const std::string& fragPath) = 0;

    // 获取材质对应的着色器
    virtual std::unique_ptr<Shader> getShader() = 0;

    // 绑定当前GPU使用的着色器
    virtual void bind() = 0;

    // 单数据传输：向GPU传递Uniform数据
    virtual void uniform(const std::string& name, const UniformValue& value) = 0;

    // 多数据传输：向GPU传递Uniform数据
    virtual void uniforms(const std::unordered_map<std::string, UniformValue>& values) = 0;

    // 解除当前GPU使用的着色器
    virtual void unbind() = 0;

    // 克隆接口（用于复制材质）
    virtual std::unique_ptr<IMaterial> clone() const = 0;

    // 获取材质参数
    virtual EngineMaterialParam::DepthParams getDepthParams() = 0;
    virtual EngineMaterialParam::BlendParams getBlendParams() = 0;
    virtual EngineMaterialParam::CullParams getCullParams() = 0;
    virtual EngineMaterialParam::StencilParams getStencilParams() = 0;
};

#endif //IMATERIAL_H
